using System;
using System.Windows.Forms;
using App.Git.Vista.Widgets;
using App.Modelo;
using App.Modelo.Attributes;
using App.Modelo.Interfaces;
using App.Modelo.Menu;
using App.Persistencia;
using App.Seguridad.Vista.Menu;
using App.SolInf.Modelo;
using App.SolInf.Controlador;
using App.widgets;
using App.SolInf.Vista.Controls;
using NHibernate.SqlCommand;

namespace App.SolInf.Vista.Listado
{
    [Formulario("Clientes")]
    public partial class ListadoCliente : ListadoBusquedaGenerico
    {
        public FiltroBusquedaCliente ControlBusqueda = new FiltroBusquedaCliente();

        private ControladoraClientes _controladoraClientes;
        public ControladoraClientes ControladoraClientes
        {
            get
            {
                return _controladoraClientes ??
                       (_controladoraClientes =
                        ModuloSolInf.Instance.FabricaControladoras.Factory<ControladoraClientes>());
            }
            set
            {
                _controladoraClientes = value;
            }
        }
        

        public ListadoCliente()
        {
            ContenedorModulo = ModuloSolInf.Instance;

            BotonCancelar = BotonSeleccionar = false;
            
            AddColumn("Razon Social", "RazonSocial");
            AddColumn("Domicilio", "Domicilio");
            AddColumn("Documento");
            SearchControls.Add(ControlBusqueda);
            var controladorBoton = new MenuControladoraBotonera
            {
                Controls = ControlesGestion,
                Model = new MenuContenedor(new MenuBaseItem[] {
                        new MenuBoton("Nuevo", "add", "Clientes/alta"),
                        new MenuBoton("Ver", "view", "Clientes/ver"),
                        new MenuBoton("Modificar", "edit", "Clientes/modificar"),
                        new MenuBoton("Eliminar", "delete", "Clientes/baja")
                    })
            };

            controladorBoton.ExecuteCommand += new EventHandler<MenuEjecutarComandoEventArgs>(controladorBoton_ExecuteCommand);
        }


        void controladorBoton_ExecuteCommand(object sender, MenuEjecutarComandoEventArgs e)
        {
            var item = GetSelectedItem<Cliente>();

            if (e.Item.Command == "Clientes/alta")
            {
                new Comandos.ComandoAltaCliente().Ejecutar();
            }
            else if (e.Item.Command == "Clientes/ver" && _seleccionar())
            {
                var form = new DetalleClienteForm
                {
                    Empresa = (Cliente)ItemSeleccionado,
                    Controladora = ControladoraClientes
                };
                form.Ver();
            }
            else if (e.Item.Command == "Clientes/modificar" && _seleccionar())
            {
                var form = new DetalleClienteForm
                {
                    Empresa = (Cliente)ItemSeleccionado,
                    Controladora = ControladoraClientes
                };
                form.Modificar();
            }
            else if (e.Item.Command == "Clientes/baja" && _confirmar())
            {
                try
                {
                    ControladoraClientes.Baja(item);
                    MessageBox.Show("Se elimino el cliente", Text);
                    OnSearch();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }



        protected override void OnSearch()
        {
            DataSource = ControlBusqueda.AplicarFiltro(ControladoraClientes.Consultar()).List<Cliente>();
        }

        [Comando("modificar", "Modifica un cliente existente en la base de datos")]
        public void Modificar()
        {
            ContenedorModulo.AbrirFormulario(this);
        }

        [Comando("ver")]
        public void Ver()
        {
            ContenedorModulo.AbrirFormulario(this);
        }


        [Comando("baja")]
        public void Baja()
        {
            ContenedorModulo.AbrirFormulario(this);
        }
    }
}